Перейти к основному содержимому

⚙️ Сборочная система и rpmbuild

🎯 Цель раздела

В этом разделе вы:

  • узнаете, как работает процесс сборки RPM-пакета;
  • поймёте назначение каждой секции в SPEC-файле;
  • освоите макросы и структуру buildroot;
  • научитесь собирать и проверять пакеты в изолированной среде.

🧩 Что делает rpmbuild

Утилита rpmbuild — центральный инструмент инженера сопровождения. Она:

  1. читает SPEC-файл,
  2. извлекает исходники из SOURCES,
  3. выполняет сборку, установку и упаковку,
  4. создаёт SRPM и RPM пакеты.

Схематично процесс выглядит так:


SOURCES + SPEC → rpmbuild → SRPM → RPM


📁 Структура рабочего дерева

После выполнения rpmdev-setuptree создаётся стандартное дерево:


~/rpmbuild/
├── BUILD # Временные файлы сборки
├── RPMS # Готовые бинарные пакеты
├── SOURCES # Исходники (tar.gz, патчи)
├── SPECS # SPEC-файлы
└── SRPMS # Исходные пакеты (SRPM)

Каждая директория участвует в цикле сборки.


🔧 Основные этапы сборки

rpmbuild проходит по секциям SPEC-файла в строгом порядке:

  1. %prep — подготовка исходников

    Распаковка архива, применение патчей:

     %prep
    %setup -q
    %patch0 -p1
  2. %build — сборка

    Здесь выполняются команды компиляции:

    %build
    ./configure --prefix=/usr
    make
  3. %install — установка в buildroot

    Установка файлов в изолированный каталог:

    %install
    make install DESTDIR=%{buildroot}
  4. %files — описание содержимого пакета

    Что попадёт в итоговый RPM:

    %files
    /usr/bin/hello
    /usr/share/doc/hello/*
    %changelog — история изменений.

🧰 Макросы RPM

RPM использует макросы — переменные, которые упрощают SPEC-файл.

МакросЗначение
%{name}Имя пакета
%{version}Версия
%{buildroot}Каталог установки при сборке
%{_bindir}/usr/bin
%{_libdir}/usr/lib64
%{_sysconfdir}/etc

Пример:

install -m 0755 myapp %{buildroot}%{_bindir}/myapp

💡 Макросы позволяют писать переносимые и читаемые SPEC-файлы.


🧪 Практическая сборка и отладка

Попробуем собрать пакет в “отладочном” режиме:

rpmbuild -ba SPECS/hello.spec --clean --define "_smp_mflags -j$(nproc)"
  • -ba — собрать всё (SRPM + RPM),
  • --clean — очистить временные каталоги после сборки,
  • --define — переопределить макросы (например, количество потоков сборки).

🧱 Buildroot и изоляция

Buildroot — временный каталог, где устанавливается пакет перед упаковкой. Он обеспечивает:

  • чистоту сборки (никаких файлов из системы);
  • предсказуемость результата;
  • совместимость с ABF.

Расположение buildroot:

/home/user/rpmbuild/BUILDROOT/<имя>-<версия>-<релиз>.<арх>

⚙️ Именно buildroot архивируется и превращается в .rpm.


🧰 Проверка и тестирование сборки

После сборки проверьте:

rpm -qlp RPMS/x86_64/hello-1.0-1.x86_64.rpm

Проверьте установку “вхолостую”:

sudo rpm -Uvh --test RPMS/x86_64/hello-1.0-1.x86_64.rpm

Если всё прошло без ошибок, можно устанавливать:

sudo dnf install RPMS/x86_64/hello-1.0-1.x86_64.rpm

🧩 Частые ошибки при сборке

ОшибкаПричинаРешение
File not found: /usr/bin/...Файл не установлен в buildrootДобавить установку в %install
Unknown tag: %somethingНеправильный макросПроверить синтаксис и документацию
missing buildidОтсутствует сборка с debug-инфоДобавить %global debug_package %{nil} при тестах
rpmbuild failedОшибка в секции %buildПроверить логи в ~/rpmbuild/BUILD/

🧠 Мини-тест для самопроверки

ВопросОтвет
Что делает секция %prep?Распаковывает исходники и применяет патчи
Где располагается buildroot?В ~/rpmbuild/BUILDROOT/
Для чего нужны макросы %{_bindir} и %{buildroot}?Для унификации путей и изоляции сборки
Чем отличается %build от %install?%build компилирует, %install устанавливает файлы
Как проверить состав пакета без установки?rpm -qlp <путь>.rpm

🧭 Итого

Теперь вы:

  • освоили rpmbuild и структуру SPEC-файла на практике;
  • поняли назначение макросов и buildroot;
  • умеете читать, собирать и проверять пакеты;
  • готовы перейти к следующему шагу — работе с патчами, версиями и исходниками, чтобы адаптировать пакеты под ROSA Linux.

Следующий документ — “Патчи, исходники и версии” — раскроет, как модифицировать исходный код и управлять обновлениями в SRPM.